25. 矩阵乘法

矩阵乘法

卡尔曼滤波器方程有很多乘法运算。实际上,每个方程都包含一个矩阵乘法运算。

矩阵乘法和矩阵加法或减法不同。在矩阵加法中,我们从第一个矩阵中取出一个元素,在第二个矩阵中找到匹配元素,然后输出总和。

我们也可以在矩阵中将匹配的元素相乘,但这就是所谓的元素乘法。矩阵乘法是完全不同的运算。它编程更加复杂。

矩阵相乘
\mathbf{A}
带有矩阵
\mathbf{B} 的唯一可能性在于,
\mathbf{A} 中的列数等于
\mathbf{B} 中的行数。因此,如果 \mathbf{A}
m \times n ,那么 \mathbf{B} 应该是 n \times p m p 的值可以是任意正整数。

\mathbf{A} \times \mathbf{B} 的结果是一个大小为 m \times p 的矩阵。

矩阵乘法的正式定义

以下为两个矩阵相乘的正式公式:

(\mathbf{AB}) {ij} = \sum {k=1}^n a_{ik}b_{kj}

也就是说,要在结果矩阵中找到元素(i,j),就需要

  • 取矩阵 A 中的第 i 行,矩阵 B 中的第 j 列
  • 在 i 行的 A 向量和 j 列的 B 向量上进行元素相乘
  • 结果元素求和

但是,你已经完成了元素的乘法运算,并且将两个向量的结果元素相加。这就是本课向量部分中点积的定义!将矩阵行看作一个向量,将矩阵列看作一个向量;你已经编写过计算点积的代码。

所以,你已经完成了矩阵乘法编程的一部分任务!

我们来看一个具体的例子,了解矩阵乘法的原理。相乘的两个矩阵是:

\begin{bmatrix}17&25&6&2\\6 & 1 & 97 & 4 \\80&8&54&15\end{bmatrix} \times\begin{bmatrix}3&14&1&7&42&5\\32&11&2&4&18&17\\19&81&4&8&5&10\\27&2&3&6&7&3\end{bmatrix}=\begin{bmatrix}1019&1003&97&279&1208&576\\2001&7960&408&846&783&1029\\1927&5612&357&1114&3879&1121\end{bmatrix}

请注意,矩阵 \mathbf{A} 有三行四列 (3 x 4),矩阵 \mathbf{B} 有四行六列 (4×6)。所以,输出是一个 3×6 的矩阵。

第一行第一列的数字 1019 是怎么得出的?根据矩阵乘法公式,它是矩阵 \mathbf{A} 的第一行与矩阵 \mathbf{B} 的第一列相乘得出的。

因此,你可以计算 A 的第一行和 B 的第一列的点积。点积计算时,首先进行元素乘法,然后对结果求和:

\begin{bmatrix}17&25&6&2\end{bmatrix}\cdot\begin{bmatrix}3&32&19&27\end{bmatrix}

= 17 \times 3 + 25 \times 32 + 6 \times 19 + 2 \times 27
= 1019

看下面的注释,了解详细情况:

如何计算第一行第二列的值?

第一排第二列

如何计算第一行第二列的结果?

SOLUTION: 取 A 的第一行和 B 的第二列,计算点积

在下面的视图中,你可以看到如何计算第一行第二列中的值。

我们往后看,这里可以看到如何计算第二排、第四列。你需要矩阵 \mathbf{A} 的第二行和矩阵 \mathbf{B} 的第四列。

继续这个过程,可以得到:
\begin{bmatrix}1019 & 1003 & 97 & 279 & 1208 & 576 \\2001 & 7960 & 408 & 846 & 783 & 1029 \\1927 & 5612 & 357 & 1114 & 3879 & 1121\end{bmatrix}

现在,轮到你用 Python 进行矩阵乘法编码了。

矩阵乘法编程

编写矩阵乘法代码可能非常棘手。你需要分开求解好消息是,矩阵乘法编程是本课程模块最终项目的重要部分。

首先,想想矩阵乘法涉及哪些步骤。你需要将两个矩阵相乘,其大小为

  • m x n
  • n x p

然后输出大小为 m x p 的矩阵。

在之前的练习中,你已经使用嵌套 for 循环遍历矩阵。那么,如何才能用一个嵌套 for 循环来计算 m×p 矩阵中的每个元素?接下来,在你知道了 A 中必要的行和 B 中必要的列后,如何结合这些值来得到正确答案?

下一页有一个 Ipython Notebook 练习,你可以在其中编写代码。